-- 获取限流的 Redis key
local key = KEYS[1]

-- 获取注解上标注的限流次数（桶的容量）
local limit = tonumber(ARGV[1])

-- 获取当前时间戳（毫秒）
local now = tonumber(ARGV[2])

-- 获取漏桶的泄漏间隔（毫秒）
local interval = tonumber(ARGV[3])

-- 获取上次漏水的时间戳，如果不存在则为 0
local lastLeak = tonumber(redis.call('GET', key .. ':lastLeak') or '0')

-- 获取桶中当前的令牌数量，如果不存在则为 0
local tokens = tonumber(redis.call('GET', key .. ':tokens') or '0')

-- 计算自上次漏水以来已经泄漏的令牌数量
if now - lastLeak >= interval then
    tokens = tokens - ((now - lastLeak) // interval)
    if tokens < 0 then
        tokens = 0
    end
    -- 更新桶中令牌数量和上次漏水时间戳
    redis.call('SET', key .. ':tokens', tokens)
    redis.call('SET', key .. ':lastLeak', now)
end

-- 如果桶中令牌数量小于限制，则增加一个令牌并返回当前数量加 1
if tokens < limit then
    redis.call('INCRBY', key .. ':tokens', 1)
    return tokens + 1
else
    -- 否则返回 0 表示请求被拒绝
    return 0
end
